package com.sumainfor.pc.gmio.service.impl;

import com.sumainfor.common.util.DateUtils;
import com.sumainfor.common.util.JsonResult;
import com.sumainfor.common.utlis.CompuUtils;
import com.sumainfor.common.wechat.WeChatConfig;
import com.sumainfor.pc.gmio.dao.HoTenantBillMapper;
import com.sumainfor.pc.gmio.dao.SeBpwMapper;
import com.sumainfor.pc.gmio.feign.Zfeign.ZpcMktFeign;
import com.sumainfor.pc.gmio.feign.Zfeign.ZzuulFeign;
import com.sumainfor.pc.gmio.feign.ZuulFeign.ZuulFeign;
import com.sumainfor.pc.gmio.service.HoTenantBillService;
import org.apache.commons.collections.MapUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 服务管家租客管理
 */
@Service
public class HoTenantBillExxxSerivceImpl  {

    private ReentrantLock lock = new ReentrantLock(false);
    Logger log = LoggerFactory.getLogger(HoTenantBillExxxSerivceImpl.class);
    @Autowired
    private HoTenantBillMapper hoTenantBillMapper;

    /*
     *退租账单根据客户编号和房源详表编号查询合同已产生的金额
     */
    public JsonResult getHoProduceMoneyExt(Map<String, Object> params) {
        JsonResult result = new JsonResult();
        if (params.get("Source") == null || params.get("TenId") == null || params.get("HouInfoId") == null
                || params.get("EndTime") == null || params.get("PaActMonthPrice") == null || params.get("StartTime") == null
                || params.get("PaMonthPrice") == null || params.get("Pmethod") == null
        ) {
            return result.putFailed("参数不正确");
        }
        //查询合同的总金额
        Map<String, Object> map = hoTenantBillMapper.getHoProduceMoney(params);
        String nowTime = null;
        //ceshi这个参数用来测试退租时间跟合同开始时间或者结束时间所算金额是否正确
        if (MapUtils.getInteger(params,"ceshi")==1){
        nowTime = "2020-10-20";
        }else if (MapUtils.getInteger(params,"ceshi")==2){
            nowTime = "2020-08-20";
        }else{
             nowTime = MapUtils.getString(params,"nowTime");//当前时间
        }

            //活动是否生效  1 表示活动未生效 2 表示活动生效
         Integer actityInt = MapUtils.getInteger(params,"actityInt");
        String endTime = params.get("EndTime").toString();//合同结束时间
        String StartTime = params.get("StartTime").toString();//合同开始时间
        Integer ifRent = 0;//0 违约退 1 正常退
        Integer ifDay = 0;//0 未到合同开始时间 1 已经到了合同开始时间

        BigDecimal PaMonthPrice = new BigDecimal(params.get("PaMonthPrice").toString());//统一定价月租金
        BigDecimal pactMoney = new BigDecimal(params.get("PaActMonthPrice").toString());//合同月租金
        BigDecimal dayMoney = new BigDecimal("0");//日租金
        BigDecimal PaidBiMoney = new BigDecimal(map.get("PaidBiMoney").toString());//已支付的房租金额（带房租押金）
        BigDecimal ProBiMoney = new BigDecimal(map.get("ProBiMoney").toString());//已产生的房租账单金额
        BigDecimal actualDeposit = new BigDecimal(params.get("actualDeposit").toString());//押金
        Integer Deposit = MapUtils.getInteger(params,"Deposit");//押金月份

        //租金账单显示的已支付房租金额
        BigDecimal BillYesMoney = PaidBiMoney.subtract(actualDeposit.multiply(new BigDecimal(String.valueOf(Deposit))));
        int dayCount = 0;//应退天数
        int monthCount = 0;//应退月份
        int dayCountsss = 0;//应退还总天数
        BigDecimal produceMoney = new BigDecimal("0");//已产生费用
        BigDecimal retireMoney = new BigDecimal("0");//应退还费用


        //日租金计算方式
        if (actityInt ==2) {//活动生效日租金计算
            dayMoney = PaMonthPrice.multiply(new BigDecimal(String.valueOf("12"))).divide(new BigDecimal(String.valueOf("365")),2,BigDecimal.ROUND_HALF_UP);
        }else{
            dayMoney = pactMoney.multiply(new BigDecimal(String.valueOf("12"))).divide(new BigDecimal(String.valueOf("365")),2,BigDecimal.ROUND_HALF_UP);
        }
        if(DateUtils.differentDays(nowTime, endTime)<=31&&DateUtils.differentDays(nowTime, endTime)>=0){//表示正常退

            ifRent = 1;
            ifDay = 1;
            Map<String,Object> map1 = new HashMap<>();
            map1.put("TenId",params.get("TenId"));
            map1.put("HouInfoId",params.get("HouInfoId"));
            Map<String,Object> getAllRoomBill = hoTenantBillMapper.getAllRoomBill(map1);
            BigDecimal produceMoneys = new BigDecimal(getAllRoomBill.get("BiMoney").toString());//已产生的房租账单金额
            produceMoney = produceMoneys.subtract(actualDeposit.multiply(new BigDecimal(String.valueOf(Deposit))));
            retireMoney = BillYesMoney.subtract(produceMoney);//应退还费用
            dayCountsss = 0;//应退还总天数0;


        }else if(DateUtils.differentDays(nowTime, endTime)>31&&(DateUtils.compare_date(StartTime, nowTime, "yyyy-MM-dd").equals("2"))){//退租时间在合同结束之后

            ifRent = 0;
            ifDay = 1;
            produceMoney = dayMoney.multiply(new BigDecimal(String.valueOf(DateUtils.differentDays(StartTime, nowTime)))).add(dayMoney);//产生金额
            retireMoney = BillYesMoney.subtract(produceMoney);//应退还费用
            dayCountsss = DateUtils.differentDays(nowTime, endTime);//应退还总天数

        }else if(DateUtils.compare_date(nowTime, StartTime, "yyyy-MM-dd").equals("2")){ //提前退
            ifRent = 1;
            ifDay = 0;//未到合同开始时间
            retireMoney = BillYesMoney.subtract(produceMoney);//应退还费用

        }else if(DateUtils.compare_date(endTime, nowTime, "yyyy-MM-dd").equals("2")){//延期退


        }

        map.put("ifRent", ifRent);//0 违约退 1 正常退
        map.put("dayMoney", dayMoney); //日租金
        map.put("retireMoney", retireMoney);//应退还费用
        map.put("produceMoney", produceMoney);//已产生费用
        map.put("ifDay", ifDay);//0 未到合同开始时间 1 已经到了合同开始时间
        map.put("dayCountsss",dayCountsss);//应退还总天数
        map.put("BillYesMoney",BillYesMoney);//已支付房租金额
        result.put(map);
        return result;



//
//        //没到合同开始时间(比较两个日期的大小（yyyy-MM-dd）2 date1在date2之前 1 date1在date2之后 0 相等 3异常)
//        if (DateUtils.compare_date(nowTime, endTime, "yyyy-MM-dd").equals("2")){//退租时间在合同结束之前
//
//
//
//
//
//
//
//            ifRent = 0;//表示违约退
//            if(DateUtils.compare_date(nowTime, StartTime, "yyyy-MM-dd").equals("2")){//退租时间在合同开始之前
//                ifDay = 0;//表示未到合同开始之前
//                retireMoney = BillYesMoney;//应退还房租费用为已支付的
//
//            }else if (DateUtils.compare_date(nowTime, StartTime, "yyyy-MM-dd").equals("3")){
//                return result.putFailed("服务器繁忙");
//            }else{
//                ifDay = 1;//已经到了合同开始时间
//                //比较退租时间和开始时间和结束时间是否在同一个月
//                Boolean zczsSta = DateUtils.checkMonth(nowTime,StartTime);
//                if (zczsSta){
//                    //获取当前时间所在月份的天数（获取日期所在月的天数）比如5月就是31天
//                    Integer beginCount = DateUtils.getMonthOfDay(nowTime);
//                    //获取退租跟所在月份的最后一天相差多少天
//                    Integer dayCountOne = Math.abs(DateUtils.differentDays(nowTime, DateUtils.getMonthLastDay(nowTime)));
//                    //获取合同结束日期跟所在月份的第一天相差多少天
//                    Integer dayCountTwo = Math.abs(DateUtils.differentDays(endTime, DateUtils.getMonthFirstDay(endTime)));
//                    //获取退还天数(废弃)
//                    dayCount = dayCountOne+dayCountTwo;
//                     //获取退还月数（废弃）
//                    monthCount = Math.abs(DateUtils.getMonthDiff(endTime,nowTime,"yyyy-MM"))-1;
//                    //应退还总天数
//                    dayCountsss = Math.abs(DateUtils.differentDays(nowTime,endTime));
//                    if(actityInt == 2){
//                        //当前月的日租金为(活动生效)
//                        dayMoney = pactMoney.divide(new BigDecimal(String.valueOf(beginCount)),2,BigDecimal.ROUND_HALF_UP);
//                        //已产生费用为
//                        produceMoney = dayMoney.multiply(new BigDecimal(String.valueOf(Math.abs(DateUtils.differentDays(nowTime,StartTime)))));
//                        //应退金额为
//                        retireMoney = BillYesMoney.subtract(produceMoney);
//                    }else{
//                        //当前月的日租金为(活动不生效)
//                        dayMoney = PaMonthPrice.divide(new BigDecimal(String.valueOf(beginCount)),2,BigDecimal.ROUND_HALF_UP);
//                        //已产生费用为
//                        produceMoney = dayMoney.multiply(new BigDecimal(String.valueOf(Math.abs(DateUtils.differentDays(nowTime,StartTime)))));
//                        //应退金额为
//                        retireMoney = BillYesMoney.subtract(produceMoney);
//
//                    }
//                }else{
//                    Boolean zczsEnd = DateUtils.checkMonth(nowTime,endTime);//在最后一个月退租
//                    if (zczsEnd){
//                        //退还月（废弃）
//                        monthCount = 0;
//                        //退还天数
//                        dayCount = Math.abs(DateUtils.differentDays(nowTime,endTime));
//                        //获取当前时间所在月份的天数（获取日期所在月的天数）比如5月就是31天
//                        Integer beginCount = DateUtils.getMonthOfDay(nowTime);
//                        //应退还总天数
//                        dayCountsss = Math.abs(DateUtils.differentDays(nowTime,endTime));
//
//                        if(actityInt == 2){
//                            //日租金（活动生效）
//                            dayMoney = pactMoney.divide(new BigDecimal(String.valueOf(beginCount)),2,BigDecimal.ROUND_HALF_UP);
//                            //应退金额
//                            retireMoney = dayMoney.multiply(new BigDecimal(String.valueOf(dayCount)));
//                            //已产生费用
//                            produceMoney = BillYesMoney.subtract(retireMoney);
//
//                        }else{
//                            //日租金（活动不生效）
//                            dayMoney = PaMonthPrice.divide(new BigDecimal(String.valueOf(beginCount)),2,BigDecimal.ROUND_HALF_UP);
//                             //在最后一个月退租，合同周期内不按照活动不生效产生费用的周期
//                            Integer PactCountOne=DateUtils.getMonthSpace(endTime,StartTime,"yyyy-MM-dd")-1;
//                            BigDecimal produceMoneyMonth = PaMonthPrice.multiply(new BigDecimal(String.valueOf(PactCountOne)));
//                            //最后一个月开始到退租的时候，按活动不生效产生的费用
//                            BigDecimal produceMoneyDay = dayMoney.multiply(new BigDecimal(String.valueOf(dayCount)));
//
//                            //那么已产生的费用则为两者相加
//                            produceMoney =produceMoneyMonth.add(produceMoneyDay);
//                            //应退金额
//                            retireMoney = BillYesMoney.subtract(produceMoney);
//                        }
//
//                    }else{//退租时间不在开始月也不在最后月
//
//                        //应退还总天数
//                        dayCountsss = Math.abs(DateUtils.differentDays(nowTime,endTime));
//                        //获取当前时间所在月份的天数（获取日期所在月的天数）比如5月就是31天
//                        Integer beginCount = DateUtils.getMonthOfDay(nowTime);
//                        //当前时间所在月份的第一天
//                        String a1 =  DateUtils.getMonthFirstDay(nowTime);
//                        //获取合同开始时间所在月份的天数（获取日期所在月的天数）比如5月就是31天
//                        Integer beginCountwww = DateUtils.getMonthOfDay(StartTime);
//                        //合同开始时间所在月份的最后一天
//                        String a2 = DateUtils.getMonthLastDay(StartTime);
//                        //获取合同开始月到当前月相差的月份
//                        int ss1 = Math.abs(DateUtils.getMonthDiff(StartTime,nowTime,"yyyy-MM"))-1;
//                        if(actityInt == 2){
//                            //当前月的日租金为（并且为前端显示的日租金）(活动生效)
//                            dayMoney = pactMoney.divide(new BigDecimal(String.valueOf(beginCount)),2,BigDecimal.ROUND_HALF_UP);
//                            //当前时间到当前月第一天产生的金额
//                            BigDecimal asdw1 = dayMoney.multiply(new BigDecimal(String.valueOf(Math.abs(DateUtils.differentDays(a1,nowTime)))));
//                            //合同开始的日租金为
//                            BigDecimal dayMoney2 = pactMoney.divide(new BigDecimal(String.valueOf(beginCountwww)),2,BigDecimal.ROUND_HALF_UP);
//                            //合同开始时间到合同开始时间最后一个月产生的金额
//                            BigDecimal asdw2 = dayMoney2.multiply(new BigDecimal(String.valueOf(Math.abs(DateUtils.differentDays(a2,StartTime)))));
//                            //已产生费用
//                            produceMoney = asdw1.add(asdw2).add(pactMoney.multiply(new BigDecimal(String.valueOf(ss1))));
//                            //应退金额
//                            retireMoney = BillYesMoney.subtract(produceMoney);
//                        }else{
//                            //当前月的日租金为（并且为前端显示的日租金）(活动不生效)
//                            dayMoney = PaMonthPrice.divide(new BigDecimal(String.valueOf(beginCount)),2,BigDecimal.ROUND_HALF_UP);
//                            //当前时间到当前月第一天产生的金额
//                            BigDecimal asdw1 = dayMoney.multiply(new BigDecimal(String.valueOf(Math.abs(DateUtils.differentDays(a1,nowTime)))));
//                            //合同开始的日租金为
//                            BigDecimal dayMoney2 = PaMonthPrice.divide(new BigDecimal(String.valueOf(beginCountwww)),2,BigDecimal.ROUND_HALF_UP);
//                            //合同开始时间到合同开始时间最后一个月产生的金额
//                            BigDecimal asdw2 = dayMoney2.multiply(new BigDecimal(String.valueOf(Math.abs(DateUtils.differentDays(a2,StartTime)))));
//                            //已产生费用
//                            produceMoney = asdw1.add(asdw2).add(PaMonthPrice.multiply(new BigDecimal(String.valueOf(ss1))));
//                            //应退金额
//                            retireMoney = BillYesMoney.subtract(produceMoney);
//                        }
//
//                    }
//
//                }
//
//            }
//
//        } else if (DateUtils.compare_date(nowTime, endTime, "yyyy-MM-dd").equals("0")) { //退租时间等于结束时间（正常退）
//            ifRent = 1;//正常退
//            ifDay = 1;//到了合同开始时间
//           // produceMoney = BillYesMoney;//已产生费用
//
//            Map<String,Object> map1 = new HashMap<>();
//            map1.put("TenId",params.get("TenId"));
//            map1.put("HouInfoId",params.get("HouInfoId"));
//            Map<String,Object> getAllRoomBill = hoTenantBillMapper.getAllRoomBill(map1);
//            BigDecimal produceMoneys = new BigDecimal(getAllRoomBill.get("BiMoney").toString());//已产生的房租账单金额
//            produceMoney = produceMoneys.subtract(actualDeposit.multiply(new BigDecimal(String.valueOf(Deposit))));
//
//            dayCountsss = 0;//退还总天数
//            retireMoney = BillYesMoney.subtract(produceMoney);//应退还费用
//            //获取当前时间所在月份总天数
//            Integer beginCount = DateUtils.getMonthOfDay(nowTime);
//            if(actityInt == 2){
//                //日租金（活动生效）
//                dayMoney = pactMoney.divide(new BigDecimal(String.valueOf(beginCount)),2,BigDecimal.ROUND_HALF_UP);
//            }else{
//                //日租金（活动不生效）
//                dayMoney = PaMonthPrice.divide(new BigDecimal(String.valueOf(beginCount)),2,BigDecimal.ROUND_HALF_UP);
//            }
//        } else {
//            return result.putFailed("服务器繁忙");
//        }
//        map.put("ifRent", ifRent);//0 违约退 1 正常退
//        map.put("dayMoney", dayMoney); //日租金
//        map.put("retireMoney", retireMoney);//应退还费用
//        map.put("produceMoney", produceMoney);//已产生费用
//        map.put("ifDay", ifDay);//0 未到合同开始时间 1 已经到了合同开始时间
//        map.put("dayCountsss",dayCountsss);//应退还总天数
//        map.put("BillYesMoney",BillYesMoney);//已支付房租金额
//        result.put(map);
//        return result;
    }



}
